JavaScript
part 15/19 Β· 71.2 KB total
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
l'ensemble des variables non locales qu'elle a capturΓ©, soit par valeur
(conservation d'une copie de chaque donnΓ©e liΓ©e aux variables non
locales), soit par rΓ©fΓ©rence (conservation d'une rΓ©fΓ©rence Γ chaque
donnΓ©e liΓ©e aux variables non locales). Comme en JavaScript toutes les
variables sont de type rΓ©fΓ©rence (cf. la section
Liaison des identifiants), JavaScript n'utilise que la capture par
rΓ©fΓ©rence β ce qui correspond en C++ 11 Γ la syntaxe [&](β¦) { β¦ }; β, et
la durΓ©e de vie des variables non locales capturΓ©es par une fonction est
Γ©tendue Γ la durΓ©e de vie de la fonction β ce qui n'est pas le cas en
C++ 11, quel que soit le type de capture :
function maFonction() {
var maVariable = 4; // variable parente
return function () {
alert(maVariable);
}
}
var maFermeture = maFonction(); // capture de la variable parente par
rΓ©fΓ©rence
maFermeture(); // affiche 4
Expressions de fonctions immΓ©diatement invoquΓ©es
Jusqu'Γ ECMAScript 6, JavaScript ne proposait pas nativement de portΓ©e
des variables au niveau des blocs (pas de mots-clΓ© let ou const), ni de
modules. Pour Γ©viter de polluer l'espace global, une mΓ©thode consistait
Γ encapsuler son code dans une fonction pour s'appuyer sur la portΓ©e des
variables qui a lieu au niveau des fonctions en JavaScript, puis Γ
invoquer cette fonction juste après. Pour regrouper les deux étapes
(dΓ©finition de la fonction et invocation) et ne pas ajouter un nom de
fonction supplΓ©mentaire dans l'espace global, le langage permet les
expressions de fonctions immΓ©diatement invoquΓ©es (EFII ; en anglais
immediately-invoked function expressions, IIFE)cite-ref-30[30].
Plusieurs syntaxes sont possibles pour ce type d'expression, les plus
rΓ©pandues Γ©tant :
pour sa lisibilitΓ©)cite-ref-31[31] ;
β’ (function (β¦) { β¦ })(β¦);
L'opΓ©rateur d'invocation de fonction () Γ la fin permet l'exΓ©cution
immΓ©diate de la fonction. Les parenthΓ¨ses en gras indiquent Γ
l'analyseur syntaxique qu'elles contiennent une expression, car en
JavaScript les parenthèses ne peuvent pas contenir de déclaration.
Autrement, dans la plupart des situations, le mot clΓ© function est
traitΓ© comme une dΓ©claration de fonction, et pas comme une expression de
fonction. Il existe d'autres faΓ§ons pour forcer une expression de
fonction :
β’ !function (β¦) { β¦ }(β¦);
β’ ~function (β¦) { β¦ }(β¦);
β’ -function (β¦) { β¦ }(β¦);
β’ +function (β¦) { β¦ }(β¦);
Dans les contextes oΓΉ une expression est attendue il n'est pas
nécessaire d'utiliser les parenthèses en gras :
β’ var maVariable = function (β¦) { β¦ }(β¦);
β’ true && function (β¦) { β¦ }(β¦);
β’ 0, function (β¦) { β¦ }(β¦);
Une utilisation importante des expressions de fonctions immΓ©diatement
invoquΓ©es est pour la crΓ©ation de modules. Les modules permettent Γ la
fois de rassembler des propriΓ©tΓ©s et des mΓ©thodes dans un espace de nom
et de rendre certains membres privΓ©s :
var compteur = (function () {
var i = 0; // propriΓ©tΓ© privΓ©e
return { // mΓ©thodes publiques
obtenir: function () {
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ